<?php
namespace App\Utilities;

use App\DBs\SlideCodeDB;

class SlideCode
{
    protected $bgWidth = 240; //背景宽度
    protected $bgHeight = 150; //背景高度
    protected $markWidth = 40; //滑块宽度
    protected $markHeight = 40; //滑块高度
    protected $toMarkW = 0; //滑块目标位置宽度
    protected $toMarkH = 40; //滑块目标位置高度
    protected $fault = 5; //容错象素
    protected $db;

    public function __construct()
    {
        $this->db = new SlideCodeDB();
    }

    /**
     * 生成验证码
     */
    public function setMake($stamp)
    {
        //抽选背景图
        $bgPath = 'img/slideCode/bg/'.mt_rand(1,6).'.png'; //背景图
        $markBgPath = 'img/slideCode/mbg.png'; //标记背影图
        //定义目标标记位置，容错范围
        $randW = $this->bgWidth - $this->markWidth; //容错X
        $toMarkW = $this->toMarkW = mt_rand(40, $randW);
//        //创建标记图
//        $markTu = 'img/slideCode/mtu.png';
//        $prefix2 = 'uploads/'.date('Ymd',time());
//        if(!file_exists($prefix2)){ mkdir($prefix2, 0777); }
//        $markNewPath = $prefix2.'/mark'.date('YmdHis').uniqid().'.png';
//        $this->createMark($bgPath,$markTu,$markNewPath,$toMarkW);
        //创建标记背景图片目录
        $prefix = 'uploads/'.date('Ymd',time());
        if(!file_exists($prefix)){ mkdir($prefix, 0777); }
        $markBgNewPath = $prefix.'/markbg'.date('YmdHis').uniqid().'.png';
        $markPath = 'img/slideCode/mslide.png'; //标记图
        $this->createBg($bgPath,$markBgPath,$markBgNewPath,$toMarkW);
        //更新到数据库
        $this->db->setAdd($stamp,$markBgNewPath,$toMarkW);
        //返回数据
        return [
            'domain' => env('DOMAIN'),
            'toWidth' => $toMarkW,
            'toHeight' => $this->toMarkH,
//            'initBg' => $bgPath,
            'markBg' => $markBgNewPath,
            'mark' => $markPath,
//            'errTotal' => 0,
        ];
    }

    public function setCheck($stamp,$w)
    {
        $resDb = $this->db->setCheck($stamp,(int)$w,$this->fault);
        if ($resDb['code']!=0) { return $resDb; }
        if ($resDb['result']==1) { return array('code'=>'-3','msg'=>'验证失败'); }
        return array('code'=>'0','msg'=>'验证成功');
    }

//    /**
//     * 创建标记图片
//     */
//    public function createMark($bg,$mark,$newPath,$w)
//    {
//        $path = 'img/slideCode/mtu2.png';
//        $path2 = 'img/slideCode/mtu3.png';
//        //创建源图的实例, 从字符串中的图像流新建一副图像
//        $src = imagecreatefromstring(file_get_contents($bg));
//        //裁剪开区域左上角的点的坐标
//        $x = $w; $y = $this->toMarkH;
//        //裁剪区域的宽和高
//        $w = 50; $h = 50;
//        //最终保存成图片的宽和高，和源要等比例，否则会变形
//        $finalW = 50; $finalH = round($finalW * $h / $w);
//        //将裁剪区域复制到新图片上，并根据源和目标的宽高进行缩放或者拉升
//        $new = imagecreatetruecolor($finalW, $finalH);
//        imagecopyresampled($new, $src, 0, 0, $x, $y, $finalW, $finalH, $w, $h);
//        //输出图片
//        imagepng($new,$path);
//        imagedestroy($src);
//        imagedestroy($new);
//        //合并2个图
//        $path = imagecreatefrompng($path);
//        $mark = imagecreatefrompng($mark);
//        imagecopymerge($path, $mark, 0, 0, 0, 0, 50, 50, 100);
//        //生成图片
//        imagepng($path, $path2);
//        imagedestroy($path);
//        $bg = imagecreatefrompng($bg);
//        $mark = imagecreatefrompng($mark);
//        $this->imageAlphaMask($bg, $mark);
//        header("Content-type: image/png");
//        imagepng($bg,$path);
//        imagedestroy($bg);
////        imagedestroy($mark);
//    }
// 
//    public function imageAlphaMask(&$picture, $mask)
//    {
//        $xSize = imagesx($picture);
//        $ySize = imagesy($picture);
//        $newPicture = imagecreatetruecolor($xSize, $ySize);
//        imagesavealpha($newPicture, true);
//        imagefill($newPicture, 0, 0, imagecolorallocatealpha($newPicture, 100, 100, 0, 127));
//        for($x=0;$x<$xSize;$x++){
//            for($y=0;$y<$ySize;$y++){
//                $alpha = imagecolorsforindex($mask, imagecolorat($mask, $x, $y));
//                $alpha = $alpha['alpha'];
//                $color = imagecolorsforindex($picture, imagecolorat($picture, $x, $y));
//                if ($color['alpha'] > $alpha) {
//                    $alpha = $color['alpha'];
//                }
//                if ($alpha == 127) {
//                    $color['red'] = 0;
//                    $color['blue'] = 0;
//                    $color['green'] = 0;
//                }
//                $alpta = imagecolorallocatealpha($newPicture, $color['red'],
//                    $color['green'], $color['blue'], $alpha);
//                imagesetpixel($newPicture, $x, $y, $alpha);
//            }
//        }
//        imagedestroy($picture);
//    }

    /**
     * 创建背景图片
     * @param $bgPath背景图，$markBgPath标记背景图，$w合成X
     */
    public function createBg($bgPath,$markBgPath,$markBgNew,$w)
    {
        //创建图片的实例
//        $dst = imagecreatefromstring(file_get_contents($bgPath));
//        $src = imagecreatefromstring(file_get_contents($markBgPath));
        $dst = imagecreatefrompng($bgPath);
        $src = imagecreatefrompng($markBgPath);
        //把二维码图片的白色背景设为透明
        imagecolortransparent($src, imagecolorallocate($src, 255, 255, 255));
//        //获取水印图片的宽高
//        list($src_w, $src_h) = getimagesize($markBgPath);
        //将水印图片复制到目标图片上
//        imagecopymerge($dst, $src, 0, 0, 0, 0, $src_w, $src_h, 100);
        imagecopymerge($dst, $src, $w, $this->toMarkH, 0, 0, $this->markWidth, $this->markHeight, 100);
        //生成图片
        imagepng($dst, $markBgNew);
        imagedestroy($dst);
        imagedestroy($src);
    }

    /**
     * 创建滑块图片
     */
    public function createSlide($markPath)
    {
        return $markPath;
    }

    /**
     * 文件转base64输出
     * @param $filePath 文件路径
     */
    public static function getBase64ByPath($filePath)
    {
        if(file_exists($filePath)){
            $mimeType = mime_content_type($filePath);
            $base64Data = base64_encode(file_get_contents($filePath));
            return 'data:'.$mimeType.';base64,'.$base64Data;
        }
        return '';
    }
}